// 转换字符串，undefined,null等转化为""
export function praseStrEmpty(str) {
  if (!str || str == 'undefined' || str == 'null') {
    return ''
  }
  return str
}
/**
 * 前端公用方法
 */
// import { ElLoading } from 'element-plus'
import FileSaver from 'file-saver'
import * as XLSX from 'xlsx'
// let $loading = ''
const commontFn = {
  //几月前后
  addMonths(v, n) {
    v = new Date(v)
    if (v) {
      var t = new Date(
        v.getFullYear(),
        v.getMonth(),
        v.getDate(),
        v.getHours(),
        v.getMinutes(),
        v.getSeconds(),
        v.getMilliseconds(),
      )
      t.setMonth(v.getMonth() + n)
      if (t.getDate() !== v.getDate()) {
        t.setDate(0)
      }
      return t
    }
  },

  /**
   * 时间整理方法
   * @param {any} time :需要整理的时间
   * @param {string} fmt :需要整理成的时间格式，默认yyyy-MM-dd hh:mm:ss
   * @returns {string}fmt:整理后页面显示格式
   */
  parse(time, fmt = 'yyyy-MM-dd hh:mm:ss') {
    const newTime = new Date(time)
    var o = {
      'M+': newTime.getMonth() + 1, //月份
      'd+': newTime.getDate(), //日
      'h+': newTime.getHours(), //小时
      'm+': newTime.getMinutes(), //分
      's+': newTime.getSeconds(), //秒
      'q+': Math.floor((newTime.getMonth() + 3) / 3), //季度
    }
    if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (newTime.getFullYear() + '').substr(4 - RegExp.$1.length))
    }
    for (var k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) {
        fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length))
      }
    }
    return fmt
  },
  //获取近N天
  getRecentDay(day, range = 'min', time = new Date()) {
    var today = time
    let tHours = '00'
    let tMinutes = '00'
    if (typeof time === 'string') {
      if (range === 'hour') {
        time += ':00'
      }
      today = new Date(time)
    }
    switch (range) {
      case 'min':
        today.setHours(today.getHours() + day / 4)
        break
      case 'hour':
        today.setHours(today.getHours() + day)
        break
      case 'date':
        today.setDate(today.getDate() + day)
        break
      case 'month':
        today.setMonth(today.getMonth() + day)
        break
      case 'year':
        today.setFullYear(today.getFullYear() + day)
        break
      default:
        break
    }
    var tYear = today.getFullYear()
    var tMonth = today.getMonth()
    var tDate = today.getDate()
    tMonth = (tMonth + 1).toString().padStart(2, '0')
    tDate = tDate.toString().padStart(2, '0')
    if (typeof time === 'string') {
      tHours = today.getHours()
      tMinutes = today.getMinutes()
      tHours = tHours.toString().padStart(2, '0')
      tMinutes = tMinutes.toString().padStart(2, '0')
    }
    let result = tYear + '-' + tMonth + '-' + tDate + ' ' + tHours + ':' + tMinutes
    switch (range) {
      case 'hour':
        result = tYear + '-' + tMonth + '-' + tDate + ' ' + tHours
        break
      case 'date':
        result = tYear + '-' + tMonth + '-' + tDate
        break
      case 'month':
        result = tYear + '-' + tMonth
        break
      case 'year':
        result = '' + tYear
        break
      default:
        break
    }
    return result
  },
  //关闭弹窗修改modal层位置
  closeDialogModal() {
    let dialogElArr = document.getElementsByClassName('el-dialog__wrapper')
    let dialogEl = ''
    if (dialogElArr.length > 1) {
      dialogEl = dialogElArr[dialogElArr.length - 2]
    } else if (dialogElArr.length === 1) {
      dialogEl = dialogElArr[0]
    }
    let modalEl = document.getElementsByClassName('v-modal')[0]
    if (dialogEl && modalEl) {
      dialogEl.parentElement.appendChild(modalEl)
    } else if (dialogEl === '' && modalEl) {
      modalEl.remove()
    }
  },
  //文档流导出
  exportFile(data, name, type = '.xlsx') {
    let blob = new Blob([data], { type: 'application/vnd.ms-excel' }) //type是文件类，详情可以参阅blob文件类型
    let objectUrl = URL.createObjectURL(blob) //生成下载链接
    let link = document.createElement('a')
    link.href = objectUrl
    link.download = name + type
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
  },

  // //组件导出
  exportTable(name, fileName) {
    // $loading = ElLoading.service({
    //   text: '拼命加载中',
    //   spinner: 'el-icon-loading',
    //   background: 'rgba(0, 0, 0, 0.8)',
    // })
    let xlsxParam = { raw: true }
    let fix = document.querySelector('.el-table__fixed')
    let wb = ''

    /* 从表生成工作簿对象 */
    if (fix) {
      wb = XLSX.utils.table_to_book(document.querySelector('#' + name).removeChild(fix), xlsxParam)
      document.querySelector('#' + name).appendChild(fix)
    } else {
      wb = XLSX.utils.table_to_book(document.querySelector('#' + name), xlsxParam)
    }

    /* 获取二进制字符串作为输出 */
    let wbout = XLSX.write(wb, {
      bookType: 'xlsx',
      bookSST: true,
      type: 'array',
    })
    try {
      FileSaver.saveAs(
        //Blob 对象表示一个不可变、原始数据的类文件对象。
        //Blob 表示的不一定是JavaScript原生格式的数据。
        //File 接口基于Blob，继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
        //返回一个新创建的 Blob 对象，其内容由参数中给定的数组串联组成。
        new Blob([wbout], { type: 'application/octet-stream' }),
        //设置导出文件名称
        fileName + '.xlsx',
      )
    } catch (e) {
      console.log(e, wbout)
    }
    return wbout
  },

  /**
   * 表格多表头处理
   * @param {Array} list 表格行数据；
   * @returns {Array} columnsList 处理好的表头数据
   */
  columnsHandFn(list) {
    let columnsList = []
    list.map((item) => {
      let obj = {}
      obj['label'] = item.ColName
      obj['prop'] = item.DataField
      if (item.ColName.indexOf('金额') > -1) {
        obj['amount'] = true
      }
      if (item.Children) {
        obj['Children'] = commontFn.columnsHandFn(item.Children)
      }
      columnsList.push(obj)
    })
    return columnsList
  },

  /**
   * 表格合并列处理条件值
   * @param {object} row 表格行数据；
   * @param {object} mergeObjItem 一条合并条件。
   * @returns {object} code
   */
  codeFun(row, mergeObjItem) {
    if (typeof mergeObjItem === 'string') {
      return row[mergeObjItem]
    }
    let code = ''
    mergeObjItem.map((item) => {
      code += row[item]
    })
    return code
  },

  /**
   * 表格合并列数据处理
   * @param {Array} data 表格数据列表
   * @param {object} mergeObj 合并条件合集，例如{ age: 'name'}，代表age按照每一行的name相同进行合并。
   * @returns {Array} data
   */
  setMergeSpan(data, mergeObj) {
    if (!data.length) {
      return
    }
    for (const key in mergeObj) {
      let code = this.codeFun(data[0], mergeObj[key])
      data[0][`${key}rowspan`] = 1
      let num = 0
      for (let i = 1; i < data.length; i++) {
        const newCode = this.codeFun(data[i], mergeObj[key])
        if (code === newCode) {
          num++
          data[i][`${key}rowspan`] = 0
        } else {
          data[i - num - 1][`${key}rowspan`] = num + 1
          code = newCode
          num = 0
        }
        if (i === data.length - 1) {
          if (!num) {
            data[i][`${key}rowspan`] = 1
          } else {
            data[i - num][`${key}rowspan`] = num + 1
          }
        }
      }
    }
    return data
  },

  /**
   * 表格合并列
   * @param {Array} data 表格数据列表；
   * @param {object} mergeObj 合并条件合集，例如{ name: 'name'}，代表name列按照每一行的name相同进行合并。
   * @returns {object} result
   */
  mergeTable(data, mergeObj) {
    const { record, column } = data
    let result = { rowspan: 1, colspan: 1 }
    for (const key in mergeObj) {
      if ((column['slotName'] || column['dataIndex']) === key) {
        const num = record[`${key}rowspan`]
        if (num > 1) {
          result = { rowspan: num, colspan: 1 }
        } else if (num < 1) {
          result = { rowspan: 1, colspan: num }
        }
        return result
      }
    }
  },
  /***
   * 文件下载
   */
  fileDownload(response, fileName) {
    const blob = new Blob([response]) // 创建一个类文件对象：Blob 对象表示一个不可变的、原始数据的类文件对象
    // URL.createObjectURL(object) 表示生成一个 File 对象或 Blob 对象
    const url = window.URL.createObjectURL(blob)
    const dom = document.createElement('a') // 设置一个隐藏的 a 标签，href 为输出流，设置 download
    dom.style.display = 'none'
    dom.href = url
    dom.setAttribute('download', fileName) // 指示浏览器下载 url,而不是导航到它；因此将提示用户将其保存为本地文件
    document.body.appendChild(dom)
    dom.click()
    document.body.removeChild(dom) // 下载完成移除元素
    window.URL.revokeObjectURL(url) // 释放掉 blob 对象
  },

  /***
   * 处理详情列表数据
   */
  descriptionsDataFn(formItems, formData) {
    let arr = JSON.parse(JSON.stringify(formItems))
    for (let i = 0; i < arr.length; i++) {
      arr[i].value = formData[arr[i].value || arr[i].name]
    }
    return arr
  },
}
export default commontFn
